package logic

import (
	"fmt"
	"gameserver/tools/TestRobot/cmd"
	"gameserver/tools/TestRobot/models"
	"time"
)

type LogicBase struct {
	user     *models.RobotUser       // 玩家对象
	currStep StepTypeEnum            // 当前步骤
	maxStep  StepTypeEnum            // 最大步骤
	stepLi   map[StepTypeEnum]func() //步骤对应的方法
	currIC   *cmd.InputCmd           //Logic对应的命令,可以为空

	realPtr models.IUserLogic // 上层指针
	sleep   *time.Timer       // 接下来步骤需要等的时间，也可用于超时逻辑
}

func (this *LogicBase) String() string {
	return fmt.Sprintf("Logic name:%s step:%d  ", this.realPtr.GetName(), this.currStep)
}

/* 委托用的函数 */

// 生成命令参数
func (this *LogicBase) GenCmdParam(cmd *cmd.CmdInfo) {
	panic("没有写参数生成方法")
}

// 解析命令 成功继续，失败显示命令参数 这里不能设置给this
func (this *LogicBase) ParseCmd(cmd *cmd.InputCmd) bool {
	panic("没有写参数解析方法")
}

/* 生命周期 */

// 设置输出命令 如果这个逻辑是命令生成的话
func (this *LogicBase) SetInputCmd(ic *cmd.InputCmd) {
	this.currIC = ic
}

// 销毁逻辑
func (this *LogicBase) Destroy() {
	panic("没有写Destroy方法")

}

//-------------------------------------------------------------------------

func (this *LogicBase) Init(user *models.RobotUser) {
	// 指令初始化逻辑
	this.user = user
	this.currStep = 0
	this.maxStep = 0

	this.stepLi = make(map[StepTypeEnum]func())

}

// 运行
func (this *LogicBase) Run() {
	if f, ok := this.stepLi[this.currStep]; ok {
		if this.sleep != nil {
			select {
			case <-this.sleep.C:
				this.sleep = nil
				f()

			default:
			}
		} else {
			f()
		}
	}
}

// 是否结束
func (this *LogicBase) IsEnd() bool {
	return this.currStep == this.maxStep
}

// 设置当前步骤定时器，时间到了运行当前步骤的方法，不影响收消息
func (this *LogicBase) SetTimer(d time.Duration) {
	if this.sleep != nil {
		this.sleep.Stop()
		this.sleep.Reset(d)
	} else {
		this.sleep = time.NewTimer(d)
	}
}

func (this *LogicBase) GetLogicType() cmd.CmdTypeEnum {
	return this.currIC.Cmd.CmdName
}

// 类型 名字
func (this *LogicBase) GetName() string {
	panic("没有写GetName方法")
}

//------------------------------------------------------------------

// 设置下个步骤 步骤ID，等待时间 0表示不设置时间；
func (this *LogicBase) SetNext(step StepTypeEnum, d time.Duration) {
	this.currStep = step
	if d == 0 {
		if this.sleep != nil {
			this.sleep.Stop()
			this.sleep = nil
		}
	} else {
		this.SetTimer(d)
	}
}

// 逻辑出错不能继续了。
func (this *LogicBase) AddErrNum() {
	// if this.currIC != nil {

	// }
	this.user.ClearLogic()
}
